package com.liming.common.excel;


import cn.idev.excel.context.AnalysisContext;
import cn.idev.excel.read.listener.ReadListener;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.ArrayList;
import java.util.List;

/**
 * @author liming
 * @date 2025/5/15
 */
@Data
@Slf4j
@NoArgsConstructor
public abstract class AbstractExcelListener<S, C> implements ReadListener<S> {

    /**
     * 插入数据的批次大小
     */
    private static final int BATCH_COUNT = 50;
    /**
     * 原始数据容器
     **/
    private List<S> sourceData = new ArrayList<>();
    /**
     * 转换数据容器
     */
    private List<C> convertData = new ArrayList<>();
    /**
     * 是否保存数据
     **/
    private Boolean isSave = false;

    /**
     * 构造方法，子类用于初始化 isSave 参数
     *
     * @param isSave 是否保存数据
     */
    public AbstractExcelListener(Boolean isSave) {
        this.isSave = isSave;
    }

    @Override
    public void invoke(S o, AnalysisContext analysisContext) {
        sourceData.add(o);
        if (sourceData.size() >= BATCH_COUNT) {
            // 转换数据
            this.convertData.addAll(convertData());
            if (this.isSave) {
                // 保存数据
                this.saveData();
                // 保存之后，清空原数据和转换数据
                this.saveClearData();
            }
        }
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        // 处理不满足批量插入条件的数据，确保全部数据被处理
        this.convertData.addAll(convertData());
        if (this.isSave) {
            // 保存数据
            this.saveData();
            // 保存之后，清空原数据和转换数据
            this.saveClearData();
        }
    }

    private void saveClearData() {
        this.sourceData.clear();
        this.convertData.clear();
    }

    /**
     * 转换数据
     */
    protected abstract List<C> convertData();

    /**
     * 保存数据
     */
    protected abstract void saveData();
}
